package cn.tedu.map;

import java.util.*;

/*本类用于测试Map接口*/
public class MapDemo {
    public static void main(String[] args) {
        //1,创建Map对象
        /*Map中的数据要符合映射规则,一定注意要同时指定K和V的数据类型
         * 至于这个K和V具体要设置成什么类型,取决于具体的业务类型*/
        Map<Integer, String> map = new HashMap<>();
        //2,向map集合存入数据,注意方法是put并且需要存入一对<K,V>的值
        map.put(9527, "白骨精");
        map.put(9528, "黑熊精");
        map.put(9529, "鲤鱼精");
        map.put(9530, "黄毛怪");
        map.put(9527, "女儿国国王");
        map.put(9531, "黑熊精");
        /*1,map中的key不允许重复,如果重复,后面的value会把前面的value覆盖掉
         * 比如女儿国国王和白骨精的key都是9527,白骨精就被覆盖掉了
         * 2,map中的value可以重复,比如我们有两个黑熊精*/
        System.out.println(map);

        //3,进行方法测试
        //map.clear();//清空集合
        //System.out.println(map);
        System.out.println(map.isEmpty());//false,判断集合是否为空
        System.out.println(map.size());//5,获取集合中键值对的对数
        System.out.println(map.containsKey(9527));//true,判断集合是否包含指定的键
        System.out.println(map.containsValue("白骨精"));//false,判断集合是否包含指定的值
        System.out.println(map.remove(9529));//根据key删除对应的这一对键值,K和V都删了
        System.out.println(map);
        System.out.println(map.containsValue("鲤鱼精"));
        System.out.println(map.containsValue(9529));
        Collection<String> c = map.values();//将map中所有的value值取出来,存入Collection中
        System.out.println(c);

        //4,map集合的迭代方式1
        /*方式1:
        * 遍历map中的数据,但是map本身没有迭代器,所以需要先转换成set集合
        * 用到的方法:keyset():把map中的所有key值存入到set集合中Set<key>*/
        //将map集合的所有key值取出,存入set集合中,set集合的泛型就是key的类型
        Set<Integer> set = map.keySet();
        //迭代set集合,首先获取迭代器
        Iterator<Integer> it = set.iterator();
        //循环,判断是否有下一个元素可以迭代
        while (it.hasNext()){
            //获取本轮循环到的元素,就是set中的每个key
            Integer key = it.next();
            //根据key获取map中对应的value
            String value = map.get(key);
            System.out.println("{"+key+","+value+"}");//拼接打印
        }

        /*方式2:
        * 遍历map集合,需要把map集合先转成set集合
        * 是把map中的一对键值对key&value作为一个Entry<K,V>整体放入set
        * 一对K,V就是一个Entry*/
        Set<Map.Entry<Integer, String>> set2 = map.entrySet();
        Iterator<Map.Entry<Integer, String>> it2 = set2.iterator();
        while (it2.hasNext()){
            Map.Entry<Integer, String> entry = it2.next();
            System.out.println(entry);//直接打印本轮循环到的entry可以直接查看<K,V>
            Integer key = entry.getKey();//单独获取本entry中的key
            String value = entry.getValue();//单独获取本entry中的value
            System.out.println(key+"!!!"+value);
        }


    }
}